import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Solution6 {
    //创建二维数组 60ms
    public static String convert(String s, int numRows) {
        if (numRows==1){
            return s;
        }
        int i=0;//横轴位置
        int j=0;//纵轴位置
        char[][] c = new char[numRows][s.length()];// [y][x]
        for (int k=0;k<s.length();k++){
            if (i%(numRows-1)==0&&j!=numRows-1){//主要是影響下一個数的坐标
                c[j][i] = s.charAt(k);
                j++;
            }else {
                c[j][i] = s.charAt(k);
                i++;
                j--;
            }
        }
        StringBuilder result = new StringBuilder();
        for (int y=0;y<numRows;y++){
            char[] temp = c[y];//取一列
            for (int x=0;x<s.length();x++){
                if (temp[x]!= '\0'){
                    result.append(temp[x]);
                }
            }
        }
        return result.toString();
    }
    //不需要创建二维 只分rownumber个总String，最后吧他们添加在一起  用时5ms
    public static String convert1(String s, int numRows) {
        if (numRows==1){
            return s;
        }
        int i=0;//横轴位置
        int j=0;//纵轴位置
        StringBuilder[] stringBuffers = new StringBuilder[numRows];
        for (int k=0;k<numRows;k++) {
            stringBuffers[k] = new StringBuilder();
        }
            for (int k=0;k<s.length();k++){
            stringBuffers[j].append(s.charAt(k));
            if (i%(numRows-1)==0&&j!=numRows-1){//主要是影響下一個数的坐标
                j++;
            }else {
                i++;
                j--;
            }
        }
        StringBuilder result = new StringBuilder();
        for (int k=0;k<numRows;k++){
            result.append(stringBuffers[k]);
        }

        return result.toString();
    }
//    链接：https://leetcode-cn.com/problems/zigzag-conversion/solution/zzi-xing-bian-huan-by-jyd/
    //其实还可以优化，完全不需要考虑到x位置的变化，只需要考虑y的变化即可，因为x肯定是在一行数据的下一个，直接把他添加到该行字符串最后面即可
    //不难发现其y轴的本质是 +1 +1 +1 然后加到最后一行后 -1 -1 -1 ，然后到第一行后 +1 +1 +1 以此类推...
    public String answer(String s, int numRows) {
        if(numRows < 2) return s;
        List<StringBuilder> rows = new ArrayList<StringBuilder>();
        for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());//一个StringBuilder代表一行数据
        int i = 0, flag = -1;
        for(char c : s.toCharArray()) {
            rows.get(i).append(c);//先赋值，添加到属于他的行的最后面   1.赋值
            if(i == 0 || i == numRows -1) flag = - flag;//如果当前到边界，则改变方向  2.判断边界(特殊情况)
            i += flag;//下次循环的y信息(会被上面的方向影响)  3.下一个参数变化
        }
        StringBuilder res = new StringBuilder();
        for(StringBuilder row : rows) res.append(row);
        return res.toString();

    }

    public static void main(String[] args) {
//        '\0'
//        System.out.println(convert("PAYPALISHIRING",4));
        System.out.println(convert("PAYPALISHIRING",3));
//        int[][] test = new int[3][6];
//        int[] A = test[1];
//        for (int a:A){
//            System.out.println(a);
//        }
    }
}
